package com.reservation.controller.user.booking;

import com.reservation.dto.user.booking.ConfirmReservationDTO;
import com.reservation.dto.user.booking.PayDTO;
import com.reservation.dto.user.booking.RoomFilterDTO;
import com.reservation.result.Result;
import com.reservation.service.BookingService;
import com.reservation.vo.user.AvailableRoomVO;
import com.reservation.vo.user.ConfirmReservationVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.List;

@Api(tags = "会议室查询与预约相关接口")
@RestController
@RequestMapping("/api/user")
@Slf4j
public class BookingController {

    @Autowired
    private BookingService bookingService;
    
    /**
     * 筛选可预约的会议室
     *
     * @param filterDTO 筛选条件
     * @return 会议室列表
     */
    @PostMapping("/filterMeetingRoom")
    @ApiOperation("筛选可预约的会议室")
    public Result<List<AvailableRoomVO>> filterMeetingRooms(@Valid @RequestBody RoomFilterDTO filterDTO) {
        log.info("筛选会议室请求: {}", filterDTO);

        // 验证日期是否在有效范围内（当前日期到未来60天）

        // 将前端传入的日期字符串(格式为ISO标准的YYYY-MM-DD)解析转换为LocalDate对象
        // 例如："2023-12-25" → LocalDate类型的2023年12月25日
        LocalDate requestDate = LocalDate.parse(filterDTO.getDate(), DateTimeFormatter.ISO_LOCAL_DATE);

        // 获取系统当前日期作为基准日期(不含时间部分)
        LocalDate currentDate = LocalDate.now();

        // 计算最远可预约日期，即当前日期加上60天
        // 此变量表示系统允许预约的最大日期范围，用于实现"最多提前60天预约"的业务规则
        LocalDate maxAllowedDate = currentDate.plusDays(60);

        if (requestDate.isBefore(currentDate)) {
            return Result.error("无法预约过去的日期");
        }

        if (requestDate.isAfter(maxAllowedDate)) {
            return Result.error("最多可提前60天预约会议室");
        }
        // 调用服务层筛选会议室
        List<AvailableRoomVO> availableRooms = bookingService.filterAvailableRooms(filterDTO);

        return Result.success("查询成功", availableRooms);
    }

    /**
     * 确认预约会议室
     * @param confirmReservationDTO 预约信息
     * @return 预约结果
     */
    @PostMapping("/confirmReservation")
    @ApiOperation("确认预约会议室")
    public Result<ConfirmReservationVO> confirmReservation(@Valid @RequestBody ConfirmReservationDTO confirmReservationDTO) {
        log.info("确认预约请求：{}", confirmReservationDTO);

        // 调用服务层处理确认预约
        ConfirmReservationVO confirmReservationVO = bookingService.confirmReservation(confirmReservationDTO);

        return Result.success("预约成功，请在30分钟内完成支付", confirmReservationVO);
    }

    /**
     * 支付会议室预约
     * @param payDTO 预约信息
     * @return 支付结果
     */
    @PostMapping("/pay")
    @ApiOperation("支付会议室预约")
    public Result<String> pay(@Valid @RequestBody PayDTO payDTO) {
        log.info("支付会议室预约请求：{}", payDTO);

        // 调用服务层处理支付，将从用户钱包中扣款
        bookingService.pay(payDTO);

        return Result.success("支付成功");
    }



}